package com.hy.proxy.core;

import com.google.gson.Gson;
import com.google.gson.reflect.TypeToken;
import com.hy.proxy.common.FileUtils;
import com.hy.proxy.common.JsonUtils;
import com.hy.proxy.common.PathUtils;
import com.hy.proxy.core.entity.automate.Site;
import lombok.extern.slf4j.Slf4j;
import net.sf.json.JSONObject;

import java.io.File;
import java.io.IOException;
import java.util.List;

/**
 * @Author: hy
 * @Date: Created in 2019/10/7/10:18
 * @Description: 读取并解析JSON配置文件
 * @Version: 1.0
 */
@Slf4j
public class Config {

    private Gson gson = JsonUtils.getGson();

    private static JSONObject jsonObject = null;

    private static String configPath;

    /**
     * 项目打包类型
     */
    public enum PackageType {JAR, WAR}

    static {
        //首次初始化
        log.info("Static Block: 首次运行初始化配置文件");
        init();
        log.info("Static Block: 配置文件初始化完成");
    }

    public static void init() {
        try {
            //获取配置文件
            File configFile = new Config().getConfigFile();

            log.info("init: 配置文件位置为 - " + configFile.getPath());

            //读取配置文件
            String configContent = FileUtils.readFile(configFile);

            //获取Json对象
            jsonObject = JSONObject.fromObject(configContent);

        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 获取指定打包类型的配置文件路径（此方法为手动获取，建议使用自动获取）
     *
     * @param type 项目打包类型
     * @return 配置文件路径
     */
    public File getConfigFile(PackageType type) {

        String configFileName = "rebirthproxyconfig.json";

        String configPath = (type == PackageType.WAR ? PathUtils.getClassPath() : PathUtils.getProjectPath());

        //保存路径
        Config.configPath = configPath;

        return new File(PathUtils.getPath(configPath, configFileName));
    }

    /**
     * 自动获取配置文件路径
     *
     * @return 配置文件路径
     * @throws IOException 在War和Jar方式下都找不到配置文件
     */
    public File getConfigFile() throws IOException {

        //默认War包方式
        File configFile = getConfigFile(PackageType.WAR);

        //TODO 2个 if (!configFile.exists()) 合成优化
        if (!configFile.exists()) {

            log.warn("War - 在路径：" + configFile.getPath() + " 下配置文件不存在，将使用Jar方式再次查找。");

            //War包方法不存在，再次判断Jar包方式
            configFile = getConfigFile(PackageType.JAR);

            if (!configFile.exists()) {
                //都不存在
                throw new IOException("Jar - 在路径：" + configFile.getPath() + " 下配置文件不存在，请检查配置文件是否在正确位置。");
            }

            log.warn("Jar - 在路径：" + configFile.getPath() + " 下配置文件获取成功。");

        }

        return configFile;
    }

    /**
     * 获取Site对象列表
     */
    public List<Site> getSiteList() {
        String siteJson = jsonObject.get("site").toString();
        return gson.fromJson(siteJson, new TypeToken<List<Site>>() {
        }.getType());
    }

    /**
     * 设置webDriverPath的系统属性以支持Selenium工作
     */
    public void setWebDriverPath() {

        String webDriverPath;
        String driverFileName;

        //判断系统
        if (System.getProperty("os.name").toLowerCase().startsWith("win")) {
            webDriverPath = jsonObject.get("WinWebDriverPath").toString();
            driverFileName = "chromedriver.exe";
        } else {
            //在给Linux设置时，先给chromedriver添加下权限，不然会报 The driver is not executable: xxx
            webDriverPath = jsonObject.get("LinuxWebDriverPath").toString();
            driverFileName = "chromedriver";
        }

        //验证配置WebDriver路径，如果为 ”“，则证明在项目目录下
        if ("".equals(webDriverPath)) {
            webDriverPath = PathUtils.getPath(Config.configPath,"webdriver");
        }

        //设置
        System.setProperty("webdriver.chrome.driver", PathUtils.getPath(webDriverPath, driverFileName));

        log.info("setWebDriverPath: webdriver.chrome.driver的路径是 - " + System.getProperty("webdriver.chrome.driver"));
    }

}
